home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / masm.arc / SD24.ASM < prev    next >
Assembly Source File  |  1985-03-06  |  32KB  |  699 lines

  1.  
  2.     TITLE   SD - SORTED DIRECTORY V3.0
  3.     PAGE    64,132                                         ; 3/24/84
  4. COMMENT |
  5.     SD [d:][filename[.ext]] [options]
  6.      [filespec] same as for DIR command
  7.       [options] * /A - List hidden files.
  8.                * /E - Without screen erase.
  9.                * /W - Don't wait when screen full.                  djm
  10.                * /R - Include directory entries (high intensity)    djm
  11.                * /M - Display Modified entries only                 djm
  12.                  /X - Sort by extension.
  13.                  /S - Sort by size.
  14.                  /D - Sort by date/time.
  15.                  /N - Do not sort, original order.
  16.                  /H - Help - only display options                   djm
  17.         Default = *.* sorted by name.ext with screen erase.
  18.        * - Option may be combined with other options.
  19.     This source file was created from an object file obtained
  20.  from Gene Plantz's BBS in Chicago. The original file name
  21.  was SD.HEX.  I then used DEBUG and CAPTURE to get the first
  22.  dis-assembly which  was then edited with WORDSTAR to create
  23.  a source that when assembled using MASM would duplicate the
  24.  original object file.
  25.    Comments have been added and I do hope they are helpful.
  26.  I have made several modifications to the first version and
  27.  am continuing to add comments.  This source file is an
  28.  excellent example for anyone wishing to learn 8086/8088
  29.  assembly language.  Use at your own risk and feel free to
  30.  share this file with your friends.
  31.    I certainly wish that John Chapman would publish his
  32.  source file.  His comments are sure to be more meaningful
  33.  than mine could ever be.  Some of the conversion routines
  34.  are very elegant, but difficult to understand.  As far as
  35.  I'm concerned, PRINTDD is magic.
  36.    Several modifications have been made.  They are:
  37.          1. Filespecs are processed like DIR does.
  38.         2. No sort option was added. /N
  39.         3. Pause when screen full option added. /P  changed to /W by DJM
  40.     4. Number of files found is printed.
  41.                                      Ted Reuss
  42.                                     Houston, TX
  43.      SDIR Version 2.2  The GETFREE Subroutine was updated for DOS 2.0
  44.     April 1, 1983   by   Jack Y. Fong
  45.     Changes are denoted by "JYF" at the end of changed lines.
  46.     I (Dave Mc Laughlin) have also made several modifications: (V 3.0)
  47.         Pause is now standard unless /P is entered to defeat
  48.         Color is now supported on color monitors
  49.         Free space is now reported at the bottom, along with
  50.           directory total (to give an idea of how many diskettes
  51.           may be required for backup)
  52.         Volume and current directory are shown on the top line
  53.           (my apologies to Capitol PC Club for removing their logo)
  54.         Modified files are shown with a + sign in place of the .
  55.         The /R option (show sub directory names) has been added
  56.         The /P option was changed to /W(ait) and /M (modified only) added
  57.     NOTE:  THIS MODIFIED VERSION REQUIRES DOS 2.0 AND ANSI.SYS TO
  58.            BE INSTALLED - SEE DOS REFERENCE MANUAL PAGE 13-2
  59. |
  60.      SUBTTL  EQUATES & STRUCTURES
  61.     PAGE
  62. IF1
  63. DOSCALL MACRO       FUNC,PARM1
  64. .xcref
  65. F_C =       FUNC
  66. IFNB <PARM1>
  67. IF F_C EQ 2 OR (F_C GE 4 AND F_C LE 6) OR F_C EQ 14 OR F_C EQ 46
  68.     MOV     DL,PARM1
  69. ELSE
  70.     MOV     DX,OFFSET PARM1
  71. ENDIF
  72. ENDIF
  73.         MOV     AH,FUNC
  74.         INT     21H
  75. .cref
  76.         ENDM
  77. ENDIF
  78. .SALL   ;supress all macro expansions
  79. ;       PC-DOS INTERRUPT 21H FUNCTION CODES
  80. ;
  81. @CHROUT EQU     2       ;display char in DL
  82. @KEYIN  EQU     8       ;kybd input w/o echo
  83. @STROUT EQU     9       ;print string terminated with $
  84. @CKEYIN EQU     12      ;clr kybd bufr & do inp.func in AL
  85. @SRCH1  EQU     17      ;search for first dir entry
  86. @SRCH2  EQU     18      ;search for next dir entry
  87. @GETDSK EQU     25      ;get default disk drive
  88. @SETDTA EQU     26      ;set disk transfer addr
  89. @FATAD2 EQU     28      ;get FAT of drive # in DL
  90. @PARSEF EQU     41      ;parse filename
  91. @GETDTE EQU     42      ;get system date
  92. @GETTME EQU     44      ;get system time
  93. @DSKFSP EQU     36H     ;get disk free space                            JYF
  94. @GETVER EQU     30H     ;get version number                             JYF
  95. @GETDIR EQU     47H     ;get directory                                  djm
  96.  CR      EQU     0DH     ;carriage return
  97. LF      EQU     0AH     ;line feed
  98. FCB_1   EQU     5CH     ;fcb for parameter 1
  99. PARAM_L EQU     80H     ;# characters in PARAM_B
  100. PARAM_B EQU     81H     ;DOS cmd parameter buffer.
  101.  ; PC-DOS packed date   <yyyyyyym mmmddddd>
  102. P_DTE           RECORD  P_YR:7,P_MO:4,P_DY:5
  103. ; PC-DOS packed time   <hhhhhmmm mmmsssss>
  104. P_TME           RECORD  P_HR:5,P_MI:6,P_2S:5
  105.  DIRNTRY STRUC               ;directory entry structure
  106. LNK     DW      0       ;ptr to next entry
  107. NAM     DB      8 DUP(0),'.' ;filename
  108. EXT     DB      3 DUP(0) ;extension
  109. TME     DW      0       ;time
  110. DTE     DW      0       ;date
  111. SZL     DW      0       ;low word of size
  112. SZH     DW      0       ;high word of size
  113. DIRNTRY ENDS
  114.          SUBTTL  DATA AREA & INITIALIZATION
  115.         PAGE
  116. SDIR    SEGMENT PUBLIC 'CODE'
  117.         ASSUME  CS:SDIR,DS:SDIR,ES:SDIR
  118.         ORG     100H
  119. MAIN    PROC    FAR
  120.         JMP     STARTS
  121. DIRWRK  DB      64 DUP (' ') ;directory work area                   djm
  122. SCRCOL  DB      27,'[33;44m$' ; brown on blue                       djm
  123. CLS     DB      27,'[2J$'       ;clear screen seq for 2.0           djm
  124. ROOT    DB      '* * ROOT * *',8 DUP (' ') ;                        djm
  125. HI_INT  DB      27,'[1m$'       ;high intensity for dir entry       djm
  126. BROWN   DB      27,'[0;33;44m$' ;return to brown foreground         djm
  127. DIRSW   DB      0       ;0=this is not a directory entry            djm
  128. TOTL    DW      0       ;low order word of total size used          djm
  129. TOTH    DW      0       ;high order                                 djm
  130. DIRLNK  DW      DIRBUF  ;ptr to next opening in DIRBUF
  131. C1LNK   DW      0       ;ptr to row 1, column 1
  132. C2LNK   DW      0       ;ptr to row 1, column 2
  133. NBRFILS DW      0       ;# of files or detail lines
  134. SRTFLG  DB      0       ;if = 0 then sort else no sort
  135. CLSFLG  DB      0       ;if = 0 then clear screen
  136. EXTFLG  DB      0       ;if <> 0 then sort by ext
  137. SIZFLG  DB      0       ;if <> 0 then sort by size
  138. DTEFLG  DB      0       ;if <> 0 then sort by date/time
  139. PSEFLG  DB      'W'     ;if <> 0 then pause if screen full          djm
  140. MODFLG  DB      0       ;if <> 0 then display modified only         djm
  141. OPTFLG  DB      0       ;if <> 0 then display options (no directory)djm
  142. LPERSCR EQU 25      ;Lines per screen
  143. LINCNT  DB      LPERSCR-4 ;Number of lines left
  144. PSEMSG  DB      27,'[32mStrike a key when ready . . . ' ;           djm
  145.         DB      27,'[33m$'      ;return color to brown              djm
  146.  HDNG1   DB      'Vol: ',27,'[31;43m'    ;red on brown background    djm
  147. VOLLOC  DB      11 DUP (' ')    ;put volume label here              djm
  148.         DB      27,'[33;44m  '  ;set color back to normal           djm
  149.         DB      'Dir: ',27,'[31;43m'     ;red on brown background   djm
  150. DIRLOC  DB      17 DUP (' ')    ;put directory name here            djm
  151.         DB      27,'[33;44m  '  ;set color back to normal           djm
  152.         DB      'Drive: '
  153.         DB      27,'[31;43m'    ;red on brown                       djm
  154. HDRVE   DB      '@'             ;drive goes here                    djm
  155.         DB      27,'[33;44m'    ;set color back to normal           djm
  156.         DB      3 DUP (' '),'Date: '    ;                           djm
  157.         DB      27,'[31;43m'    ;red on brown                       djm
  158. D_MM    DW      '00'            ;Month
  159.         DB      '/'
  160. D_DD    DW      '00'            ;Day
  161.         DB      '/'
  162. D_YY    DW      '00'            ;Year
  163.         DB      27,'[33;44m '   ;color back to normal               djm
  164.         DB      'Time: '
  165.         DB      27,'[31;43m'    ;red on brown                       djm
  166. T_HH    DW      '00'            ;Hours
  167.         DB      ':'
  168. T_MM    DW      '00'            ;Minutes
  169.         DB      27,'[33;44m'    ;back to normal                     djm
  170.         DB      CR,LF
  171. CRLF    DB      CR,LF,'$'
  172. HDNG2   DB      'Filespec.ext  Bytes-  --Last Change--$'
  173.         DB      8 DUP(' ')
  174. SPACES  DB      '$'
  175. RED     DB      27,'[31m',CR,LF,'$'     ;                           djm
  176. HDNG3   DB      ' File(s)',8 DUP (' '),'$'
  177. HDNG5   DB      ' Directory Total',9 DUP (' '),'$'      ;           djm
  178. HDNG6   DB      ' Free Space'
  179.         DB      27,'[0;33;44m',CR,LF,'$' ;reset colors              djm
  180. OPTHDG  DB      27,'[1;25H',27,'[31;43m'        ;option headings   ;djm
  181.         DB      'S O R T E D   D I R E C T O R Y'                  ;djm
  182.         DB      27,'[33;44m'                                       ;djm
  183.         DB      27,'[3;10HDisplay Options:'                        ;djm
  184.         DB      27,'[5;15H/A     Include hidden files'             ;djm
  185.         DB      27,'[6;15H/R     Include directory names'          ;djm
  186.         DB      27,'[7;15H/M     Show only files that have been '  ;djm
  187.         DB      'modified since last backup'                       ;djm
  188.         DB      27,'[8;15H/E     Don',39,'t erase screen before display'
  189.         DB      27,'[9;15H/W     Don',39,'t wait when screen is full'
  190.         DB      27,'[13;10HSort Options:'                          ;djm
  191.         DB      27,'[15;15H/X     Sort by EXTENSION'               ;djm
  192.         DB      27,'[16;15H/S     Sort by SIZE'                    ;djm
  193.         DB      27,'[17;15H/D     Sort by DATE and time'           ;djm
  194.         DB      27,'[18;15H/N     No sort'                         ;djm
  195.         DB      27,'[20;1H$'                                       ;djm
  196.         SUBTTL  DISK TRANSFER AREA & FREE SPACE ENTRY DEFS
  197.         PAGE
  198.  XFCB    DB      -1,7 DUP(0),11 DUP('?'),25 DUP(0)
  199. ATTRIB  EQU     XFCB+6          ;file attribute
  200. DRVNBR  EQU     ATTRIB+1        ;drive # (1=A, 2=B, etc.)
  201.  DTA     DB      40 DUP(0)       ;Disk Transfer Area used
  202. FILNAME EQU     DTA+8           ;by SRCHDIR for the
  203. FILTIME EQU     DTA+30          ;directory search.
  204. FILSIZE EQU     DTA+36
  205. FILATR  EQU     DTA+19
  206.  FREESPC DW      0               ;Free space entry.
  207.         DB      '*FREE SPACE*',4 DUP(0)
  208. LOSIZE  DW      0               ;of free space
  209. HISIZE  DW      0               ;of free space
  210.          SUBTTL  MAIN PROGRAM SECTION
  211.         PAGE
  212. STARTS:
  213.         PUSH    DS              ;Set up the
  214.         XOR     AX,AX           ; stack for a
  215.         PUSH    AX              ; return to DOS.
  216.         CALL    GETARGS         ;Process arguments
  217.         CALL    SRCHDIR         ;Search directory
  218.         CMP     SRTFLG,0        ;Check if any sort
  219.         JZ      A1              ; option selected.
  220.         CALL    LNKDIRB         ;Leave in original
  221.         JMP     SHORT A2        ; directory order.
  222. A1:     CALL    SRTDIRB         ;Sort by major key
  223. A2:     MOV     AL,OPTFLG       ;See if only options wanted         djm
  224.         OR      AL,AL           ;See if H request for help          djm
  225.         JZ      A3              ;Wasn't                             djm
  226.         CALL    SHOWOPT         ;Show option screen                 djm
  227.         JMP     SHORT A99       ;get out                            djm
  228. A3:     CALL    GETFREE         ;Get free space
  229.         CALL    SPLTLST         ;Set up for 2 columns
  230.         CALL    PRTHDNG         ;Print headings
  231.         CALL    PRTDRVR         ;Print detail lines
  232.         CALL    PRTNFLS         ;Print # of files
  233. A99:    RET                     ;Return to DOS
  234. MAIN    ENDP
  235.          SUBTTL  SHOWOPT - SHOW OPTIONS
  236. SHOWOPT PROC    NEAR            ;                                    djm
  237.         DOSCALL @STROUT,CLS     ;clear the screen                    djm
  238.         DOSCALL @STROUT,SCRCOL  ;make screen colorful                djm
  239.         DOSCALL @STROUT,OPTHDG  ;display options                     djm
  240.         RET
  241. SHOWOPT ENDP
  242.         SUBTTL  GETARGS - PROCESS ARGUMENTS
  243.         PAGE
  244. GETARGS PROC    NEAR
  245.         MOV     SI,PARAM_B      ;point to cmd buffer
  246.         MOV     DI,OFFSET DRVNBR ;point to FCB
  247.         MOV     AL, 1111B       ;Select parse options
  248.         DOSCALL @PARSEF         ;Parse filename
  249.         CMP     BYTE PTR [DI],0 ;If <> 0 then
  250.         JNZ     B1              ; not default drive
  251.         DOSCALL @GETDSK         ;AL <- default disk
  252.         INC     AL              ;Increment drive #
  253.         STOSB                   ;Save drive #
  254. B1:     MOV     SI,PARAM_L      ;SI <- ptr cmd length
  255.         MOV     CH,0
  256.         MOV     CL,[SI]         ;CL <- # chars in cmd
  257.         JCXZ    B99             ;                                   djm
  258. B2:     INC     SI              ;Point to next char
  259.         CMP     BYTE PTR [SI],'/'
  260.         JNZ     B8              ;If not a slash
  261.         MOV     AL,[SI+1]       ;AL <- option letter
  262.         AND     AL,0DFH         ;Force to upper-case
  263.         CMP     AL,'A'          ;Hidden & system files?
  264.         JNZ     B31             ;Nope, try next one.                djm
  265.         OR      BYTE PTR ATTRIB,2+4  ;Hidden & system               djm
  266. B31:    CMP     AL,'R'          ;directory entries?                 djm
  267.         JNZ     B3              ;Nope, try next one.                djm
  268.         OR      BYTE PTR ATTRIB,10H     ;Directory                  djm
  269. B3:     CMP     AL,'E'          ;Without screen erase?
  270.         JNZ     B4              ;Nope, try next one.
  271.         MOV     CLSFLG,AL
  272. B4:     CMP     AL,'S'          ;Sort by size?
  273.         JNZ     B5              ;Nope, try next one.
  274.         MOV     SIZFLG,AL
  275. B5:     CMP     AL,'D'          ;Sort by date/time?
  276.         JNZ     B6              ;Nope, try next one.
  277.         MOV     DTEFLG,AL
  278. B6:     CMP     AL,'X'          ;Sort by extension?
  279.         JNZ     B7              ;Nope, try next one.
  280.         MOV     EXTFLG,AL
  281. B7:     CMP     AL,'N'          ;Original order?
  282.         JNZ     B8              ;Nope, try next one.
  283.         MOV     SRTFLG,AL
  284. B8:     CMP     AL,'W'          ;Wait when screen full?
  285.         JNZ     B9              ;Nope, try next one.
  286.         MOV     AL,0            ;put zero in al                     djm
  287.         MOV     PSEFLG,AL       ;                                   djm
  288. B9:     CMP     AL,'M'          ;Just show modified entries?        djm
  289.         JNZ     B10             ;Nope, try next one.                djm
  290.         MOV     MODFLG,AL       ;                                   djm
  291. B10:    CMP     AL,'H'          ;Just show options?                 djm
  292.         JNZ     B11             ;Nope, try next one                 djm
  293.         MOV     OPTFLG,AL       ;                                   djm
  294. B11:    LOOP    B2              ;Test for another param.
  295. B99:    RET
  296. GETARGS ENDP
  297.          SUBTTL  SRCHDIR - SEARCH DIRECTORY
  298.         PAGE
  299. SRCHDIR PROC    NEAR
  300.         MOV     BH,ATTRIB ;save attrib                              djm
  301.         MOV     BYTE PTR ATTRIB,8       ;get volume label           djm
  302.         DOSCALL @SETDTA,DTA                                         djm
  303.         DOSCALL @SRCH1,XFCB     ;get volume label                   djm
  304.         OR      AL,AL           ;found it?                          djm
  305.         JNZ     C11             ;none found                         djm
  306.         MOV     SI,OFFSET FILNAME ;source field                     djm
  307.         MOV     DI,OFFSET VOLLOC        ;put in vol label           djm
  308.         MOV     CX,11           ;length                             djm
  309.         CLD                     ;clear direction flag               djm
  310.         REPZ    MOVSB           ;do it                              djm
  311. C11:    MOV     ATTRIB,BH       ;restore attribute                  djm
  312.         DOSCALL @SETDTA,DTA     ;Set DTA for dir. search
  313.         DOSCALL @SRCH1,XFCB     ;First call to search dir.
  314. C1:     OR      AL,AL
  315.         JZ      C21             ;found                              djm
  316.         JMP     C2              ;not found - quit looking           djm
  317. C21:    MOV     BX,DIRLNK       ;BX <- base of DIRBUF
  318.         LEA     DI,[BX].NAM
  319.         MOV     SI,OFFSET FILNAME
  320.         MOV     AL,[SI]         ;get first byte of entry            djm
  321.         CMP     AL,'.'          ;see if sub directory entry         djm
  322.         JZ      C41             ;yes - skip                         djm
  323.         MOV     CX,SIZE NAM
  324.         CLD
  325.         REPZ    MOVSB           ;Move filename to DIRBUF
  326.         MOV     AL,FILATR       ;load file attributes               djm
  327.         TEST    AL,20h          ;see if attr bit set                djm
  328.         JZ      C3              ;no                                 djm
  329.         MOV     BYTE PTR [DI],'+'       ;                           djm
  330.         JMP     SHORT C4        ;                                   djm
  331. C3:     ; not modified - now see if /M set                          djm
  332.         CMP     MODFLG,0        ;see if /M set                      djm
  333.         JNE     C41             ;wasn't                             djm
  334.         TEST    AL,10H          ;see if directory entry             djm
  335.         JZ      C31             ;no                                 djm
  336.         MOV     BYTE PTR [DI],'-'       ;store a minus for dir      djm
  337.         JMP     SHORT C4        ;                                   djm
  338. C31:    MOV     BYTE PTR [DI],'.' ; Store a period
  339. C4:     INC     DI
  340.         MOV     CX,SIZE EXT
  341.         REPZ    MOVSB           ;Move ext to DIRBUF
  342.         MOV     SI,OFFSET FILTIME
  343.         MOVSW                   ;Move time to DIRBUF
  344.         MOVSW                   ;Move date to DIRBUF
  345.         MOV     SI,OFFSET FILSIZE
  346.         MOV     AX,[SI]         ;get number for size addition       djm
  347.         ADD     TOTL,AX         ;add                                djm
  348.         MOVSW                   ;Move size to DIRBUF
  349.         MOV     AX,[SI]         ;get high order                     djm
  350.         ADC     TOTH,AX         ;add                                djm
  351.         MOVSW
  352.         ADD     BX,SIZE DIRNTRY ;Point to next entry
  353.         MOV     DIRLNK,BX       ;Save ptr
  354.         INC     NBRFILS         ;Increment file count
  355. C41:    DOSCALL @SRCH2,XFCB     ;Search for next file
  356.         JMP     C1              ;Loop for next one
  357. C2:     RET
  358. SRCHDIR ENDP
  359.          SUBTTL  SRTDIRB - SORTS ENTRIES IN DIRBUF
  360.         PAGE
  361. SRTDIRB PROC    NEAR    ;Sorts directory entries in DIRBUF
  362.         MOV     DI,OFFSET DIRBUF ;Point to DIRBUF
  363. D1:     CMP     DI,DIRLNK       ;Are there anymore?
  364.         JNC     D8              ;NO, exit
  365.         MOV     SI,OFFSET C1LNK ;Start with column 1 ptr
  366. D2:     MOV     BX,SI
  367.         MOV     SI,[BX]         ;SI<-ptr to next entry
  368.         OR      SI,SI
  369.         JZ      D7              ;if link=0
  370.         MOV     AX,SI
  371.         MOV     DX,DI
  372.         XOR     CL,CL           ;CL <- 0
  373.         CMP     CL,SIZFLG
  374.         JNZ     D5              ;If sort by size
  375.         CMP     CL,DTEFLG
  376.         JNZ     D4              ;If sort by date/time
  377.         CMP     CL,EXTFLG
  378.         JNZ     D3              ;If sort by ext
  379.         LEA     SI,[SI].NAM
  380.         LEA     DI,[DI].NAM
  381.         MOV     CX,1+SIZE NAM+SIZE EXT  ;# of bytes
  382.         JMP     SHORT D6
  383. D3:     LEA     SI,[SI].EXT     ;Sort by extension
  384.         LEA     DI,[DI].EXT
  385.         MOV     CX,SIZE EXT     ;# of bytes
  386.         JMP     SHORT D6
  387. D4:     LEA     SI,[SI].DTE     ;Sort by date/time
  388.         LEA     DI,[DI].DTE
  389.         MOV     CX,2            ;# of words
  390.         STD
  391.         REPZ    CMPSW
  392.         MOV     DI,DX
  393.         MOV     SI,AX
  394.         JBE     D2
  395.         JMP     SHORT D7
  396. D5:     LEA     SI,[SI].SZH     ;Sort by size
  397.         LEA     DI,[DI].SZH
  398.         MOV     CX,2            ;# of words
  399.         STD
  400.         REPZ    CMPSW
  401.         MOV     DI,DX
  402.         MOV     SI,AX
  403.         JBE     D2
  404.         JMP     SHORT D7
  405. D6:     CLD                     ;Sort by name.ext
  406.         REPZ    CMPSB
  407.         MOV     DI,DX
  408.         MOV     SI,AX
  409.         JBE     D2
  410. D7:     MOV     [DI],SI
  411.         MOV     [BX],DI
  412.         ADD     DI,SIZE DIRNTRY ;Point to next entry
  413.         JMP     D1
  414. D8:     RET
  415. SRTDIRB ENDP
  416.          SUBTTL
  417.         PAGE
  418. ; LNKDIRB - LINKS ENTRIES IN DIRBUF
  419.  LNKDIRB PROC    NEAR            ;LINK ENTRIES IN DIRBUF
  420.         MOV     DI,OFFSET DIRBUF
  421.         MOV     C1LNK,DI       ;Point to 1st entry
  422.         MOV     CX,NBRFILS      ;Set loop counter
  423.         DEC     CX
  424. LNK1:   MOV     BX,DI
  425.         ADD     DI,SIZE DIRNTRY ;Offset to next entry
  426.         MOV     [BX],DI         ;Store ptr
  427.         LOOP    LNK1            ;Link next entry
  428.         MOV     [DI],CX         ;Last ptr <- null
  429.         RET
  430. LNKDIRB ENDP
  431.  ; SPLTLST - SPLITS LINKED LIST IN HALF
  432.  SPLTLST PROC    NEAR
  433.         MOV     CX,NBRFILS      ;Get # of entries
  434.         SAR     CX,1            ; and divide by 2
  435.         JZ      F2              ;if NBRFILS < 2
  436.         ADC     CL,0            ;Account for odd #
  437.         MOV     BX,OFFSET C1LNK
  438. F1:     MOV     BX,[BX]         ;Chain thru list to
  439.         LOOP    F1              ; last row of column 1.
  440.         MOV     AX,[BX]         ;Get ptr to 1st row of col 2
  441.         MOV     C2LNK,AX        ; C2LNK <- R1,C2 ptr
  442.         MOV     [BX],CX         ;Last row of col 1 <- null
  443. F2:     RET
  444. SPLTLST ENDP
  445.          SUBTTL  GETFREE - GET DISK FREE SPACE
  446. GETFREE PROC    NEAR            ;cluster = allocation unit
  447.         MOV     DL,DRVNBR       ;Get drive #
  448.         PUSH    DS              ;Save DS
  449.         DOSCALL @DSKFSP         ;get disk free space                JYF
  450.         MUL     BX              ;AX (sectors/clustor) * BX (free cluJYF
  451.         MOV     DX,AX           ;                                   JYF
  452.         MUL     CX              ;AX * CX (bytes/clustor)            JYF
  453. E5:                             ;                                   JYF
  454.         POP     DS              ;Restore DS
  455.         MOV     LOSIZE,AX       ;Save the 32 bit
  456.         MOV     HISIZE,DX       ; binary free space
  457.         RET
  458. GETFREE ENDP
  459.          SUBTTL  PRTHDNG - PRINT HEADINGS
  460.         PAGE
  461. PRTHDNG PROC        NEAR
  462.         MOV     AL,CLSFLG
  463.         OR      AL,AL
  464.         JNZ     G1              ;If not erase screen
  465.         DOSCALL @STROUT,CLS     ;clear screen for 2.0               djm
  466. G1:     MOV     AL,DRVNBR       ;Get drive #
  467.         ADD     HDRVE,AL        ;Convert to ascii
  468.         DOSCALL @GETDTE ; CX<-year, DH<-month, DL<-day
  469.         MOV     AL,DH
  470.         AAM
  471.         XCHG    AL,AH
  472.         OR      D_MM,AX         ;Fold into month
  473.         MOV     AL,DL
  474.         AAM
  475.         XCHG    AL,AH
  476.         OR      D_DD,AX         ;Fold into day
  477.         MOV     AX,CX
  478.         SUB     AX,1900
  479.         AAM
  480.         XCHG    AL,AH
  481.         OR      D_YY,AX         ;Fold into year
  482.         DOSCALL @GETTME ; CH<-hours, CL<-minutes
  483.         MOV     AL,CH           ;AL<-binary hours
  484.         AAM                     ;Convert AL to two
  485.         XCHG    AL,AH           ; BCD digits in AX.
  486.         OR      T_HH,AX         ;Fold into hours
  487.         MOV     AL,CL           ;AL<-binary minutes
  488.         AAM                     ;Convert AL to two
  489.         XCHG    AL,AH           ; BCD digits in AX.
  490.         OR      T_MM,AX         ;Fold into minutes
  491.         DOSCALL @STROUT,SCRCOL  ;make screen colorful               djm
  492.         MOV     DL,DRVNBR       ;set dl to current drive            djm
  493.         MOV     SI,OFFSET DIRWRK ;point to work area                djm
  494.         DOSCALL @GETDIR         ;get directory                      djm
  495.         MOV     AL,[SI]         ;get 1st char                       djm
  496.         CMP     AL,0            ;see if no directory name           djm
  497.         JNE     G11             ;this is root directory             djm
  498.         MOV     SI,OFFSET ROOT  ;get * * ROOT * *                   djm
  499. G11:    MOV     DI,OFFSET DIRLOC  ;                                 djm
  500.         CLD                     ;clear direction flag               djm
  501.         MOV     CX,17           ;                                   djm
  502.         REPZ    MOVSB           ;                                   djm
  503.         DOSCALL @STROUT,HDNG1   ;Print main heading
  504.         DOSCALL @STROUT,HDNG2   ;Print column 1 heading
  505.         CMP     WORD PTR C2LNK,0
  506.         JZ      G2              ;If not 2 columns
  507.         DOSCALL @STROUT,SPACES-5 ;Print 5 spaces
  508.         DOSCALL @STROUT,HDNG2   ;Print column 2 heading
  509. G2:     DOSCALL @STROUT,CRLF    ;Start a new line
  510.         RET
  511. PRTHDNG ENDP
  512.          SUBTTL  PRINT DETAIL LINES
  513.         PAGE
  514. PRTDRVR PROC    NEAR            ;Driver routine
  515.         MOV     BX,C1LNK
  516.         OR      BX,BX           ;more to print?
  517.         JZ      H2              ; no, return
  518.         MOV     AX,[BX]
  519.         MOV     C1LNK,AX
  520.         CALL    PRTDTL          ;print column one
  521.         MOV     BX,C2LNK
  522.         OR      BX,BX
  523.         JZ      H1              ;If no column 2 entry
  524.         DOSCALL @STROUT,SPACES-5 ;print 5 spaces
  525.         MOV     AX,[BX]
  526.         MOV     C2LNK,AX
  527.         CALL    PRTDTL          ;print column two
  528. H1:     DOSCALL @STROUT,CRLF
  529.         CMP     PSEFLG,0        ;Check for pause option
  530.         JZ      PRTDRVR         ;Nope, continue
  531.         DEC     LINCNT          ;Decrement line counter
  532.         JNZ     PRTDRVR         ;If page not full?
  533.         MOV     LINCNT,LPERSCR-2 ;Reset to # lines/screen
  534.         DOSCALL @STROUT,PSEMSG  ;Display pause message.
  535.         MOV     AL,@KEYIN       ;Specify input function
  536.         DOSCALL @CKEYIN         ;Wait for key press
  537.         DOSCALL @STROUT,CRLF    ;Set to new line
  538.         JMP     PRTDRVR         ;Go do the next line
  539. H2:     RET
  540. PRTDRVR ENDP
  541.  PRTDTL  PROC    NEAR    ;Prints file.ext, size, date & time
  542.         MOV     AL,[BX][0AH]    ;get file.ext separator             djm
  543.         CMP     AL,'-'          ;see if minus inserted              djm
  544.         JNZ     SHORT I0        ;not a Dir entry                    djm
  545.         MOV     BYTE PTR [BX][0AH],' '  ;clear minus sign           djm
  546.         DOSCALL @STROUT,HI_INT  ;set next chars to high intensity   djm
  547.         OR      DIRSW,1         ;set switch on                      djm
  548. I0:     MOV     CX,1+SIZE NAM+SIZE EXT
  549.         SUB     DI,DI           ;DI <- 0
  550. I1:     DOSCALL @CHROUT,[BX+DI].NAM
  551.         INC     DI              ;point to next char.
  552.         LOOP    I1              ;go do next char.
  553.         CMP     DIRSW,1         ;see if this is directory entry     djm
  554.         JNZ     I11             ;no                                 djm
  555.         DOSCALL @STROUT,SPACES-8 ;print 8 spaces instead of size    djm
  556.         JMP     SHORT I12
  557. I11:    PUSH    BX              ;save entry base
  558.         MOV     SI,[BX].SZL     ;SI <- low size
  559.         MOV     DI,[BX].SZH     ;DI <- high size
  560.         CALL    PRINTDD         ;Print size
  561.         POP     BX              ;restore entry base
  562. I12:    DOSCALL @STROUT,SPACES-2 ;print 2 spaces
  563.         MOV     AX,[BX].DTE     ;AX <- packed date
  564.         CALL    PRTDTE
  565.         DOSCALL @STROUT,SPACES-2 ;print 2 spaces
  566.         MOV     AX,[BX].TME     ;AX <- packed time
  567.         CALL    PRTTME
  568.         CMP     DIRSW,1         ;see if switch on                   djm
  569.         JNZ     I2              ;no                                 djm
  570.         MOV     DIRSW,0         ;shut off switch                    djm
  571.         DOSCALL @STROUT,BROWN   ;put back screen color              djm
  572. I2:     RET
  573. PRTDTL  ENDP
  574.          SUBTTL  PRINTDD - PRINT A DOUBLE WORD IN DI:SI
  575.         PAGE
  576. PRINTDD PROC    NEAR    ;Prints a 32 bit integer in DI:SI
  577.         XOR     AX,AX           ;Zero out the
  578.         MOV     BX,AX           ; working
  579.         MOV     BP,AX           ; registers.
  580.         MOV     CX,32           ;# bits of precision
  581. J1:     SHL     SI,1
  582.         RCL     DI,1
  583.         XCHG    BP,AX
  584.         CALL    J6
  585.         XCHG    BP,AX
  586.         XCHG    BX,AX
  587.         CALL    J6
  588.         XCHG    BX,AX
  589.         ADC     AL,0
  590.         LOOP    J1
  591.         MOV     CX,1710H        ;5904 ?
  592.         MOV     AX,BX
  593.         CALL    J2
  594.         MOV     AX,BP
  595. J2:     PUSH    AX
  596.         MOV     DL,AH
  597.         CALL    J3
  598.         POP     DX
  599. J3:     MOV     DH,DL
  600.         SHR     DL,1            ;Move high
  601.         SHR     DL,1            ; nibble to
  602.         SHR     DL,1            ; the low
  603.         SHR     DL,1            ; position.
  604.         CALL    J4
  605.         MOV     DL,DH
  606. J4:     AND     DL,0FH          ;Mask low nibble
  607.         JZ      J5              ;If not zero
  608.         MOV     CL,0
  609. J5:     DEC     CH
  610.         AND     CL,CH
  611.         OR      DL,'0'          ;Fold in ASCII zero
  612.         SUB     DL,CL
  613.         DOSCALL @CHROUT         ;Print next digit
  614.         RET                     ;Exit to caller
  615. PRINTDD ENDP
  616.  J6      PROC    NEAR
  617.         ADC     AL,AL
  618.         DAA
  619.         XCHG    AL,AH
  620.         ADC     AL,AL
  621.         DAA
  622.         XCHG    AL,AH
  623.         RET
  624. J6      ENDP
  625.          SUBTTL  PRINT DATE, TIME & # FILES ROUTINES
  626.         PAGE
  627. PRTDTE  PROC    NEAR    ;Print packed date in AX as MM/DD/YY
  628.         OR      AX,AX
  629.         JNZ     K1              ;If date <> 0
  630.         DOSCALL @STROUT,SPACES-8 ;Print 8 spaces
  631.         RET
  632. K1:     PUSH    AX
  633.         AND     AX,MASK P_MO    ;Mask the month,
  634.         MOV     CL,P_MO         ; set shift count,
  635.         SHR     AX,CL           ; right justify, &
  636.         CALL    PRTBCD          ; print it.
  637.         DOSCALL @CHROUT,'/'
  638.         POP     AX
  639.         PUSH    AX
  640.         AND     AX,MASK P_DY    ;Mask the day &
  641.         CALL    PRTBCD          ; print it.
  642.         DOSCALL @CHROUT,'/'
  643.         POP     AX
  644.         AND     AX,MASK P_YR    ;Mask the year,
  645.         MOV     CL,P_YR         ; set shift count,
  646.         SHR     AX,CL           ; right justify,
  647.         ADD     AX,80           ; add in year bias, &
  648.                                 ; print it.
  649. PRTBCD: AAM                     ;Convert AL to BCD
  650.         OR      AX,'00'         ;Convert to ASCII
  651.         PUSH    AX
  652.         DOSCALL @CHROUT,AH      ;High order digit
  653.         POP     AX
  654.         DOSCALL @CHROUT,AL      ;Low order digit
  655.         RET
  656. PRTDTE  ENDP
  657.  PRTTME  PROC    NEAR    ;Print packed time in AX as HH:MM
  658.         OR      AX,AX
  659.         JNZ     L1
  660.         DOSCALL @STROUT,SPACES-5 ;Print 5 spaces
  661.         RET
  662. L1:     PUSH    AX
  663.         AND     AX,MASK P_HR    ;Mask the hours,
  664.         MOV     CL,P_HR         ; set shift count,
  665.         SHR     AX,CL           ; right justify, &
  666.         CALL    PRTBCD          ; print it.
  667.         DOSCALL @CHROUT,':'
  668.         POP     AX
  669.         AND     AX,MASK P_MI    ;Mask the minutes,
  670.         MOV     CL,P_MI         ; set shift count,
  671.         SHR     AX,CL           ; right justify, &
  672.         CALL    PRTBCD          ; print it.
  673.         RET
  674. PRTTME  ENDP
  675.          PAGE
  676. PRTNFLS PROC    NEAR    ;print number of files
  677.         DOSCALL @STROUT,RED     ;setup color                        djm
  678.         MOV     SI,NBRFILS      ;get # of files
  679.         XOR     DI,DI           ;zero high order
  680.         CALL    PRINTDD         ;Print # of files
  681.         DOSCALL @STROUT,HDNG3
  682.         MOV     SI,TOTL         ;set up total for print             djm
  683.         MOV     DI,TOTH         ;                                   djm
  684.         CALL    PRINTDD         ;print total space used by dir      djm
  685.         DOSCALL @STROUT,HDNG5   ;                                   djm
  686.         MOV     SI,LOSIZE       ;free space                         djm
  687.         MOV     DI,HISIZE       ;                                   djm
  688.         CALL    PRINTDD         ;print free space                   djm
  689.         DOSCALL @STROUT,HDNG6   ;                                   djm
  690.         RET
  691. PRTNFLS ENDP
  692.         EVEN
  693. DIRBUF  DIRNTRY <>      ;Buffer for directory entries
  694. SDIR    ENDS
  695.         END     MAIN
  696. XA 6: 
  697. PRTNFLS ENDP
  698.         EVEN
  699. DIRBUF  DIRNTRY <>      ;Buffer fo